// 定义链表节点类
class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}

public class LinkedListSort {

    // 链表排序方法
    public ListNode sortList(ListNode head) {
        // 递归终止条件：链表为空或只有一个节点
        if (head == null || head.next == null) {
            return head;
        }

        // 使用快慢指针找到链表的中间节点
        ListNode slow = head, fast = head.next;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        ListNode mid = slow.next; // 中间节点
        slow.next = null; // 将链表分为两部分

        // 递归排序并合并
        return merge(sortList(head), sortList(mid));
    }

    // 合并两个有序链表的方法
    private ListNode merge(ListNode l1, ListNode l2) {
        ListNode dummyHead = new ListNode(0); // 虚拟头节点
        ListNode temp = dummyHead; // 临时指针

        // 合并两个链表
        while (l1 != null && l2 != null) {
            if (l1.val < l2.val) {
                temp.next = l1;
                l1 = l1.next;
            } else {
                temp.next = l2;
                l2 = l2.next;
            }
            temp = temp.next;
        }

        // 将剩余部分连接到合并后的链表
        if (l1 != null) {
            temp.next = l1;
        } else {
            temp.next = l2;
        }

        return dummyHead.next; // 返回合并后的链表头节点
    }

    // 打印链表的方法
    public void printList(ListNode head) {
        ListNode temp = head;
        while (temp != null) {
            System.out.print(temp.val + " ");
            temp = temp.next;
        }
        System.out.println();
    }

    // 测试用例
    public static void main(String[] args) {
        // 创建链表：4 -> 2 -> 1 -> 3
        ListNode head = new ListNode(4);
        head.next = new ListNode(2);
        head.next.next = new ListNode(1);
        head.next.next.next = new ListNode(3);

        LinkedListSort sorter = new LinkedListSort();

        // 打印原始链表
        System.out.println("原始链表：");
        sorter.printList(head);

        // 对链表进行排序
        ListNode sortedHead = sorter.sortList(head);

        // 打印排序后的链表
        System.out.println("排序后的链表：");
        sorter.printList(sortedHead);
    }
}